package com.smart.community.region.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.smart.community.commons.dto.FileInfoDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 店铺信息DTO
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-09-30
 */
@Data
@Schema(description = "店铺信息DTO")
public class ShopDTO implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 店铺ID
     */
    @Schema(description = "店铺ID")
    private Long id;
    
    /**
     * 店铺名称
     */
    @NotBlank(message = "店铺名称不能为空")
    @Size(max = 100, message = "店铺名称长度不能超过100个字符")
    @Schema(description = "店铺名称", example = "张三便利店")
    private String shopName;
    
    /**
     * 店铺编码（系统自动生成，无需用户输入）
     */
    @Schema(description = "店铺编码（系统自动生成）", example = "aBc123XyZ789...")
    private String shopCode;
    
    /**
     * 店铺类型：1-餐饮，2-零售，3-服务，4-其他
     */
    @NotNull(message = "店铺类型不能为空")
    @Min(value = 1, message = "店铺类型值无效")
    @Max(value = 4, message = "店铺类型值无效")
    @Schema(description = "店铺类型", example = "1", allowableValues = {"1", "2", "3", "4"})
    private Integer shopType;
    
    /**
     * 所属社区ID
     */
    @NotNull(message = "所属社区ID不能为空")
    @Schema(description = "所属社区ID", example = "1")
    private Long communityId;
    
    /**
     * 所属楼栋ID（可选）
     */
    @Schema(description = "所属楼栋ID（可选）", example = "1")
    private Long buildingId;
    
    /**
     * 所属单元ID（可选）
     */
    @Schema(description = "所属单元ID（可选）", example = "1")
    private Long unitId;
    
    /**
     * 房间号
     */
    @NotBlank(message = "房间号不能为空")
    @Size(max = 20, message = "房间号长度不能超过20个字符")
    @Schema(description = "房间号", example = "101")
    private String roomNumber;
    
    /**
     * 楼层号
     */
    @NotNull(message = "楼层号不能为空")
    @Min(value = -10, message = "楼层号不能小于-10")
    @Max(value = 100, message = "楼层号不能大于100")
    @Schema(description = "楼层号", example = "1")
    private Integer floorNumber;
    
    /**
     * 店铺面积（平方米）
     */
    @NotNull(message = "店铺面积不能为空")
    @DecimalMin(value = "0.01", message = "店铺面积必须大于0")
    @DecimalMax(value = "10000.00", message = "店铺面积不能超过10000平方米")
    @Digits(integer = 5, fraction = 2, message = "店铺面积格式不正确")
    @Schema(description = "店铺面积（平方米）", example = "50.00")
    private BigDecimal area;
    
    /**
     * 租金价格
     */
    @NotNull(message = "租金价格不能为空")
    @DecimalMin(value = "0.00", message = "租金价格不能为负数")
    @DecimalMax(value = "999999.99", message = "租金价格不能超过999999.99")
    @Digits(integer = 6, fraction = 2, message = "租金价格格式不正确")
    @Schema(description = "租金价格", example = "3000.00")
    private BigDecimal rentPrice;
    
    /**
     * 联系人
     */
    @Size(max = 50, message = "联系人姓名长度不能超过50个字符")
    @Schema(description = "联系人", example = "张三")
    private String contactPerson;
    
    /**
     * 联系电话
     */
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系电话格式不正确")
    @Schema(description = "联系电话", example = "13800138000")
    private String contactPhone;
    
    /**
     * 营业执照号
     */
    @Size(max = 50, message = "营业执照号长度不能超过50个字符")
    @Schema(description = "营业执照号", example = "91110000123456789X")
    private String businessLicense;
    
    /**
     * 状态：0-禁用，1-启用
     */
    @Schema(description = "状态", example = "1", allowableValues = {"0", "1"})
    private Integer status;
    
    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @Schema(description = "备注", example = "店铺备注信息")
    private String remark;
    
    /**
     * 店铺图片信息列表（FileInfoDTO格式）
     * 按照《用户上传文件功能使用指南.md》规范，使用完整的文件信息格式
     */
    @Schema(description = "店铺图片信息列表，FileInfoDTO格式")
    private List<FileInfoDTO> images;
    
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Schema(description = "创建时间", example = "2025-09-30 10:00:00")
    private LocalDateTime createTime;
    
    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Schema(description = "更新时间", example = "2025-09-30 10:00:00")
    private LocalDateTime updateTime;
}
